#define TAM_PAQUETE 1024

#include "Cliente.h"
#include "ClientSideParser.h"
#include <iostream>
using namespace std;

using namespace Glib;

namespace red {
namespace protocolo {

Protocolo::Protocolo(Socket *p_pSocket) :
	m_pSocket(p_pSocket) {
	this->parser = NULL;
}

Protocolo::Protocolo(Socket *p_pSocket, Cliente* cliente) :
	m_pSocket(p_pSocket) {
	this->cliente = cliente;
	this->parser = new ClientSideParser(cliente);
}

Protocolo::~Protocolo() {
	if (this->parser != NULL)
		delete this->parser;
}

bool Protocolo::bEnviarMensaje(IMsgSal *p_pMsgSal) {
	return bEnviarPaquete(p_pMsgSal->getPaquete());
}

bool Protocolo::bRecibirMensaje() {

	string t_sPaquete;
	bool t_b = true;

	this->parser->parse_chunk("<Protocolo>\n	");
	
	while (t_b) {

		t_sPaquete = "";
		t_b = this->bRecibirPaquete(t_sPaquete);
								
		this->parser->parse_chunk(t_sPaquete);
		
		if (this->parser->isParseoFinalizado()) { 
			
			delete this->parser;
			this->parser = new ClientSideParser(this->cliente);
			this->parser->parse_chunk("<Protocolo>\n	");
			
		}
	}

	return t_b;
}

bool Protocolo::bEnviarPaquete(const string &p_sBuffer) {

	unsigned int t_wCantTotalProc = 0;
	bool t_b = false;

	if (!this->m_pSocket->getUtilizable()) {
	} 
	else if (!this->m_pSocket->send(p_sBuffer, t_wCantTotalProc)) {
	} else if (t_wCantTotalProc < p_sBuffer.length()) {
	} else {
		t_b = true;
	}

	return t_b;
}

bool Protocolo::bRecibirPaquete(string &p_sPaquete) {

	unsigned int t_wCantProc = 0;
	bool t_b = false;

	p_sPaquete = "";

	if (!this->m_pSocket->getUtilizable()) {
	} 
	else {
		t_b = this->m_pSocket->recv(p_sPaquete, TAM_PAQUETE, t_wCantProc);
	}

	return t_b;
}

}
}
